package main

import "fmt"

func main() {
	c := new(Circle)
	c.radius = 2.5
	s := Square{3.0}
	var ins1 Shaper //shaper接口的实例ins1,它自身是指针类型的
	ins1 = c        //将Circle实例c赋值给接口实例ins1 那么ins1就保存了实例c
	fmt.Println(ins1)
	ins2 := s //使用类型推断将Square实例s赋值给接口实例
	fmt.Println(ins2)

	fmt.Println(ins1.Area()) // 输出19.625
	fmt.Println(ins2.Area()) // 输出9

	println(ins1) //输出 (0x4e7d40,0xc00000a0c8)
	println(c)    //输出 0xc00000a0c8

	c2 := Circle{3.3}
	ins3 := c2
	ins3.Area()

}

/*	实例的类型       receiver
	-----------------------------------
	值类型：T        (T Type)
	指针类型：*T 	（T Type）或者（T *Type）
}	receiver		实例的类型
		-----------------------------------
		(T Type)         T 或者*T
		（T *Type）		 *T
	}*/

//1、shaper接口类型
type Shaper interface {
	Area() float64
}

//2、circle struct类型
type Circle struct {
	radius float64
}

//3、circle实现shaper中的area()方法
func (c *Circle) Area() float64 {
	return 3.14 * c.radius * c.radius
}

//4、Square struct 类型
type Square struct {
	length float64
}

//5、Square类型实现Shaper中的方法Area()
func (s *Square) Area() float64 {
	return s.length * s.length
}
